package dao

import (
	"fmt"
	"os"
	"path/filepath"
	"time"

	"gorm.io/gorm"
)

var DB *gorm.DB

// 设置默认数据库连接
func SetDefault(database *gorm.DB) {
	DB = database
}

// User 用户模型
type User struct {
	ID       uint   `gorm:"column:id;primaryKey"`
	Username string `gorm:"column:username;unique;not null"`
	Password string `gorm:"column:password;not null"`
	IsAdmin  bool   `gorm:"column:isadmin;default:false"`
	//会话 ID（用于标识用户当前登录状态）
	SID string `gorm:"column:sid;uniqueIndex"`
}

// FileNode 文件节点模型 用于后续大量使用
type FileNode struct {
	//唯一ID 因为其是uint，所以其会自增ID
	ID uint `gorm:"column:id;primaryKey"`
	//文件名
	Name string `gorm:"column:name;not null"`
	//文件路径
	Path string `gorm:"column:path;not null"`
	//是否为文件夹
	IsDir bool `gorm:"column:isdir;not null"`
	//大小
	Size int64 `gorm:"column:size;default:0"`
	//创建文件or文件夹的用户id
	UserID uint `gorm:"column:userid;not null"`
	//父文件夹id
	ParentID uint `gorm:"column:parentid;not null;default:0"`
	//版本号
	Version int `gorm:"column:version;default:1"`
	//创建时间
	CreatedAt time.Time `gorm:"column:createdat;autoCreateTime"`
	//更新时间
	UpdatedAt time.Time `gorm:"column:updatedat;autoUpdateTime"`
}

// 初始化管理员账号并创建对应文件夹和文件节点
func InitAdminUser() error {
	var count int64
	//在初始化管理员账号时，需要确保数据库中没有其他用户存在
	if err := DB.Model(&User{}).Count(&count).Error; err != nil {
		return fmt.Errorf("查询用户数量失败: %v", err)
	}
	if count == 0 {
		//创建管理员
		admin := User{
			Username: "admin",
			Password: "123456", // 密码: admin123
			IsAdmin:  true,
		}
		// 创建管理员用户
		if err := DB.Create(&admin).Error; err != nil {
			return fmt.Errorf("创建管理员用户失败: %v", err)
		}
		// 创建文件夹（格式：id_username）
		folderName := fmt.Sprintf("%d_%s", admin.ID, admin.Username)
		//自动会加上/
		folderPath := filepath.Join("data", folderName)
		//创建文件夹
		if err := os.MkdirAll(folderPath, 0755); err != nil {
			// 回滚用户创建
			DB.Delete(&admin)
			return fmt.Errorf("创建文件夹失败: %v", err)
		}
		// 创建文件节点
		rootDir := FileNode{
			Name:     admin.Username, // 根目录名称为用户名
			Path:     "/",            // 根路径
			IsDir:    true,           // 标记为目录
			UserID:   admin.ID,       // 关联用户ID
			ParentID: 0,              // 父ID为0表示根目录
		}
		// 保存根目录到数据库
		if err := DB.Create(&rootDir).Error; err != nil {
			// 回滚用户和文件夹创建
			DB.Delete(&admin)
			os.RemoveAll(folderPath)
			return fmt.Errorf("创建管理员根目录失败: %v", err)
		}

		fmt.Printf("成功为管理员 %s 创建文件夹: %s\n", admin.Username, folderPath)
		return nil
	}
	return nil
}
